const path = require('path');
const cors = require('kcors');
const payload = require('think-payload');
const isDev = think.env === 'development';
const historyFallback = require('koa2-history-api-fallback');

module.exports = [{
    handle: cors,
    options: {
        origin: '*',
        credentials: true,
        allowMethods: 'GET,HEAD,PUT,POST,DELETE,PATCH'
    }
}, {
    handle: 'meta',
    options: {
        logRequest: isDev,
        sendResponseTime: isDev
    }
}, {
    handle: 'resource',
    enable: true,
    // enable: isDev,
    options: {
        root: path.join(think.ROOT_PATH, 'www'),
        publicPath: /^\/(static|upload|dist|favicon\.ico)/
    }
}, {
    handle: 'trace',
    enable: !think.isCli,
    options: {
        debug: isDev,
        error(err) {
            think.logger.error(err);
        }

    }
}, {
    handle: payload, // 上传文件中间件
    options: {
        uploadDir: path.join(think.ROOT_PATH, 'runtime/tem'), // 存放临时的目录，请求结束后自动删除文件
        limit: '5mb', // 允许上传的最大容量
        hash: 'md5',
        keepExtensions: true, // 保留文件完整后缀名
        multiples: true, // 支持获取多个同名(input里的name)文件
        extendTypes: { // 扩展支持的上传类型
            json: ['application/x-javascript'], // //将解析应用程序/ x-JavaScript的型体中相同的方式，JSON型
            form: ['application/thinkjs-form'], // 将表单类型相同的方式解析application / thinkjs-form类型的主体
            text: ['application/thinkjs-text'], // 将文本类型相同的方式解析application / thinkjs-text类型的主体
            multipart: ['application/thinkjs-multipart'], // 多部分表单类型相同的方式解析application / thinkjs-multipart类型的主体
            xml: ['application/thinkjs-xml'] // 将xml类型相同的方式解析application / thinkjs-xml类型的主体
        }
    }
}, {
    handle: historyFallback,
    match: ctx => {
        const excludeUrl = ['/index/downloadFile']; // 需要特殊处理的请求路径，如基于get方式的(href,download)
        if (!excludeUrl.includes(ctx.path)) {
            return true;
        }
        return false;
    }
}, {
    handle: 'jwtAuth', // token鉴权
    options: {
        tokenKey: 'access_token',
        // privateKey: 'kmlc-private-3302133',//秘钥
        excludeRouter: [// 需要排除的路由
        ],
        passthrough: false // 设置为true,直接跳过jwt验证

    }
},
// {
//     handle: 'roleAuth',//角色访问验证
//     options: {
//         excludeRouter: [//需要排除的路由以什么开头
//             '/login',
//             '/static',
//             '/api'
//         ]
//     }
// },

{
    handle: 'router',
    options: {}
}, 'logic', 'controller'];